{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# PlantUML diagrams"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Adding dependency \u001b[0m\u001b[1m\u001b[32mnet.sourceforge.plantuml:plantuml-mit:1.2024.8\n",
      "\u001b[0mSolving dependencies\n",
      "Resolved artifacts count: 1\n",
      "Add to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/net/sourceforge/plantuml/plantuml-mit/1.2024.8/plantuml-mit-1.2024.8.jar\u001b[0m\n",
      "\u001b[0m"
     ]
    }
   ],
   "source": [
    "%dependency /add net.sourceforge.plantuml:plantuml-mit:1.2024.8\n",
    "%dependency /resolve"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import net.sourceforge.plantuml.SourceStringReader;\n",
    "import net.sourceforge.plantuml.FileFormatOption;\n",
    "import net.sourceforge.plantuml.FileFormat;\n",
    "\n",
    "static java.awt.Image plantUML2PNG( String code ) throws IOException { \n",
    "    var reader = new SourceStringReader(code);\n",
    "\n",
    "    try(var imageOutStream = new java.io.ByteArrayOutputStream()) {\n",
    "\n",
    "        var description = reader.outputImage( imageOutStream, 0, new FileFormatOption(FileFormat.PNG));\n",
    "\n",
    "        var imageInStream = new java.io.ByteArrayInputStream(  imageOutStream.toByteArray() );\n",
    "\n",
    "        return javax.imageio.ImageIO.read( imageInStream );\n",
    "\n",
    "    }\n",
    "}\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "8ab3c38d-cf18-42ff-bf41-b97f3b48806f"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "var code = \"\"\"\n",
    "        @startuml\n",
    "        title my first diagram\n",
    "        A --> B\n",
    "        @enduml\n",
    "        \"\"\";\n",
    "\n",
    "display( plantUML2PNG( code ) );\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Java (rjk 2.2.0)",
   "language": "java",
   "name": "rapaio-jupyter-kernel"
  },
  "language_info": {
   "codemirror_mode": "java",
   "file_extension": ".jshell",
   "mimetype": "text/x-java-source",
   "name": "java",
   "nbconvert_exporter": "script",
   "pygments_lexer": "java",
   "version": "17.0.2+8-86"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
